package workcode

import (
	"fmt"
	"inkjet168x-sdk-go/sdk/protocol/common"
)

// Builder 命令包协议构建器 - 建造者模式
type Builder struct {
	protocol *Protocol
}

// NewBuilder 创建命令包协议构建器
func NewBuilder() *Builder {
	return &Builder{
		protocol: NewProtocol(),
	}
}

// NewBuilderInterface 创建命令包协议构建器（返回接口类型）
func NewBuilderInterface() common.ProtocolBuilder {
	return NewBuilder()
}

// SetSequence 设置序列号
func (wb *Builder) SetSequence(sequence uint16) *Builder {
	wb.protocol.SetSequence(sequence)
	return wb
}

// SetCommandCode 设置命令代码
func (wb *Builder) SetCommandCode(code uint32) *Builder {
	wb.protocol.SetCommandCode(code)
	return wb
}

// SetCommandParam 设置命令参数
func (wb *Builder) SetCommandParam(param uint32) *Builder {
	wb.protocol.SetCommandParam(param)
	return wb
}

// SetCommand 同时设置命令代码和参数
func (wb *Builder) SetCommand(code, param uint32) *Builder {
	wb.protocol.SetCommandCode(code)
	wb.protocol.SetCommandParam(param)
	return wb
}

// Build 构建协议实例
func (wb *Builder) Build() (common.Protocol, error) {
	// 验证必要字段
	if err := wb.validate(); err != nil {
		return nil, err
	}
	
	// 返回协议副本
	result := *wb.protocol
	return &result, nil
}

// validate 验证构建器状态
func (wb *Builder) validate() error {
	if wb.protocol == nil {
		return fmt.Errorf("protocol is nil")
	}
	
	// 可以添加更多验证逻辑
	// 例如：验证命令代码是否在有效范围内
	
	return nil
}

// Reset 重置构建器
func (wb *Builder) Reset() common.ProtocolBuilder {
	wb.protocol = NewProtocol()
	return wb
}

// GetProtocol 获取当前协议实例（用于调试）
func (wb *Builder) GetProtocol() *Protocol {
	return wb.protocol
}
